// 封装 存储类
// web storeage 
// 1. localStoreage
// 2. sessionStorage
export class MyStorage {
  storage: Storage
  constructor(storage: Storage) {
    this.storage = storage
  }
  getItem(key: string) {
    // 如何判断一个字符串数据是否可以转为 json
    // 非常遗憾 没有一个方式可以直接判断
    try {
      // 尝试执行 try 里面的代码
      // 如果发生报错， 那么catch 语法会执行
      return JSON.parse(this.storage.getItem(key) as string)
    } catch { 
      return this.storage.getItem(key)
    }
  }
  setItem(key: string, value: any) {
    // 字符串
    if(typeof value === "string") {
      this.storage.setItem(key, value)

      // 数字 大整形  布尔  函数
    } else if(typeof value === "number" || 
    typeof value === "bigint" || 
    typeof value === "boolean" || 
    typeof value === "function") {
      this.storage.setItem(key, value.toString())
    } else if(typeof value === "object") {
      this.storage.setItem(key, JSON.stringify(value))
    }
  }
  removeItem(key: string) {
    this.storage.removeItem(key)
  }
  clear() {
    this.storage.clear()
  }
}

const l = new MyStorage(localStorage)

l.setItem('bool', true);
l.setItem('arr', [{ name: '张三', age: 20 }])
l.setItem('fn', (a: number, b: number) =>  a+ b)
l.setItem('str', '1231231')

const bool = l.getItem('bool')
const arr = l.getItem('arr')  
const fn = l.getItem('fn')
const str = l.getItem('str')

console.log(bool, arr, fn, str)
const s = new MyStorage(sessionStorage)


